package org.example.proxyPattern;

//代理模式（Proxy Pattern）是一种结构型设计模式，它提供了一个代理对象来控制对另一个对象的访问。
// 代理对象充当客户端和实际服务对象之间的中介，控制对服务对象的访问，并可以在访问前后添加额外的功能。
// 4. 客户端使用
public class ProxyPatternDemo {
    public static void main(String[] args) {
        System.out.println("===== 用户操作自己的账号 =====");
        UserService selfService = new UserServiceProxy("john", "john");
        selfService.viewProfile();
        selfService.editProfile();

        System.out.println("\n===== 用户尝试操作他人账号 =====");
        UserService otherService = new UserServiceProxy("john", "emma");
        otherService.viewProfile();
        otherService.editProfile();
        otherService.changePassword();

        System.out.println("\n===== 管理员操作他人账号 =====");
        UserService adminService = new UserServiceProxy("admin", "emma");
        adminService.viewProfile();
        adminService.editProfile();
        adminService.changePassword();
    }
}


// 1. 服务接口 - 定义真实对象和代理的通用接口
interface UserService {
    void viewProfile();
    void editProfile();
    void changePassword();
}

// 2. 真实服务对象 - 实际执行业务逻辑的类
class RealUserService implements UserService {
    private String username;

    public RealUserService(String username) {
        this.username = username;
    }

    public void viewProfile() {
        System.out.println("显示用户 " + username + " 的个人资料");
    }

    public void editProfile() {
        System.out.println("允许编辑用户 " + username + " 的个人资料");
    }

    public void changePassword() {
        System.out.println("允许用户 " + username + " 修改密码");
    }
}

// 3. 代理类 - 控制对真实服务的访问
class UserServiceProxy implements UserService {
    private RealUserService realService;
    private String currentUser;
    private String targetUser;

    public UserServiceProxy(String currentUser, String targetUser) {
        this.currentUser = currentUser;
        this.targetUser = targetUser;
    }

    private RealUserService getRealService() {
        if (realService == null) {
            realService = new RealUserService(targetUser);
        }
        return realService;
    }

    // 权限检查方法
    private boolean hasPermission(String operation) {
        // 自己可以操作自己的账号
        if (currentUser.equals(targetUser)) {
            return true;
        }

        // 管理员可以操作所有账号
        if ("admin".equals(currentUser)) {
            System.out.println("[管理员操作]");
            return true;
        }

        System.out.println("权限不足: 用户 " + currentUser + " 不能" + operation);
        return false;
    }

    public void viewProfile() {
        if (hasPermission("查看")) {
            getRealService().viewProfile();
        }
    }

    public void editProfile() {
        if (hasPermission("编辑")) {
            getRealService().editProfile();
        }
    }

    public void changePassword() {
        if (hasPermission("修改密码")) {
            getRealService().changePassword();
        }
    }
}

